package controllers;

import java.util.*;

import javax.persistence.Query;

import java.lang.Boolean;


import models.*;
import play.data.validation.MaxSize;
import play.data.validation.MinSize;
import play.data.validation.Required;
import play.jobs.Every;
import play.mvc.With;

@With(Secure.class)
public class Courses extends Application
{
	public static void voir(long id)
	{
		Course course = Course.findById(id);
		render(course);
	}
	
	public static void list()
	{
		Utilisateur utilisateur = Utilisateur.find("byPseudo", Security.connected()).first();
		List<Course> courses = Course.find("order by date_debut_course desc").fetch();
		
		render(courses, utilisateur);
	}
	
	public static void inscription(long course_id)
	{
		Course course = Course.findById(course_id);
		Utilisateur utilisateur = Utilisateur.find("byPseudo", Security.connected()).first();
		Modele_bateau modele = utilisateur.modele_bateau;
		List<Couleur> couleurs = Couleur.findAll();
		List<Participe> participants = course.participes;
		render(modele, couleurs, course, participants);
		
	}
	
	public static void list_recherche(String rechercher, String trier, String ordre)
	{
		Utilisateur utilisateur = Utilisateur.find("byPseudo", Security.connected()).first();
		List<Course> courses = new ArrayList<Course>();
		
		if(rechercher.isEmpty() || rechercher.equals("nom de course ou login joueur"))
		{
			if(trier.equals("titre_course"))
				courses = Course.find("order by titre_course " + ordre).fetch();
			if(trier.equals("ville_depart"))
			{
				courses = Course.findAll();
				if(ordre.equals("asc"))
					Collections.sort(courses, new TrieVilleDepartAsc());
				else
					Collections.sort(courses, new TrieVilleDepartDesc());
			}
			if(trier.equals("ville_arrivee"))
			{
				courses = Course.findAll();
				if(ordre.equals("asc"))
					Collections.sort(courses, new TrieVilleArriveeAsc());
				else
					Collections.sort(courses, new TrieVilleArriveeDesc());
			}
			if(trier.equals("date_debut_course"))
				courses = Course.find("order by date_debut_course " + ordre).fetch();
			if(trier.equals("date_fin_course"))
				courses = Course.find("order by date_fin_course " + ordre).fetch();
			if(trier.equals("nb"))
			{
				courses = Course.findAll();
				if(ordre.equals("asc"))
					Collections.sort(courses, new TrieCourseNbParticipantAsc());
				else
					Collections.sort(courses, new TrieCourseNbParticipantDesc());
			}
		}
		else
		{
			if(trier.equals("titre_course"))
				courses = Course.find("titre_course like ? order by titre_course " + ordre, "%"+rechercher+"%").fetch();
			if(trier.equals("ville_depart"))
			{
				courses = Course.find("titre_course like ?", "%"+rechercher+"%").fetch();
				if(ordre.equals("asc"))
					Collections.sort(courses, new TrieVilleDepartAsc());
				else
					Collections.sort(courses, new TrieVilleDepartDesc());
			}
			if(trier.equals("ville_depart"))
			{
				courses = Course.find("titre_course like ?", "%"+rechercher+"%").fetch();
				if(ordre.equals("asc"))
					Collections.sort(courses, new TrieVilleArriveeAsc());
				else
					Collections.sort(courses, new TrieVilleArriveeDesc());
			}
			if(trier.equals("date_debut_course"))
				courses = Course.find("titre_course like ? order by date_debut_course " + ordre, "%"+rechercher+"%").fetch();
			if(trier.equals("date_fin_course"))
				courses = Course.find("titre_course like ? order by date_fin_course " + ordre, "%"+rechercher+"%").fetch();
			if(trier.equals("nb"))
			{
				courses = Course.find("titre_course like ?", "%"+rechercher+"%").fetch();
				if(ordre.equals("asc"))
					Collections.sort(courses, new TrieCourseNbParticipantAsc());
				else
					Collections.sort(courses, new TrieCourseNbParticipantDesc());
			}
			
			List<Utilisateur> utilisateurs = Utilisateur.find("byPseudoLike", "%"+rechercher+"%").fetch();
			Iterator<Utilisateur> itr = utilisateurs.iterator(); 
		    while(itr.hasNext()) 
		    {
		    	Utilisateur util = itr.next();
		    	courses.addAll(util.getCourseParicipe());
		    }
		}

		render("Courses/list.html", courses, utilisateur, rechercher, trier, ordre);
	}
	
	public static void information(long course_id)
	{
		Course course = Course.findById(course_id);
		Utilisateur utilisateur = Utilisateur.find("byPseudo", Security.connected()).first();
		Bateau bateau = Bateau.find("select b " +
				"from Bateau b, Modele_bateau m, Utilisateur u, Participe p, Course c " +
				"where p.course = c and " +
				"p.bateau = b and " +
				"b.modele = m and " +
				"m.utilisateur = u and " +
				"c.id = ? and " +
				"u.id = ?", course_id, utilisateur.id).first();
		List<Couleur> couleurs = Couleur.findAll();
		List<Participe> participants = course.participes;
		render(bateau, couleurs, course, participants);
	}
	
	public static void classement(long course_id)
	{
		render();
	}
	
	public static void inscription_course(long course_id,@Required
														@MaxSize(50)
														@MinSize(3)
													String nomBateau,
													long couleur_id)
	{
		Course course = Course.findById(course_id);
		Utilisateur utilisateur = Utilisateur.find("byPseudo", Security.connected()).first();
		Modele_bateau modele = utilisateur.modele_bateau;
		List<Couleur> couleurs = Couleur.findAll();
		List<Participe> participants = course.participes;
		if(validation.hasErrors())
		{
			render("Courses/inscription.html", modele, couleurs, course, participants);
		}
		else
		{
			String message = "";
			
			List<Bateau> bateaux = Course.find("select b " +
					"from Course c, Participe p, Bateau b " +
					"where p.course = c and " +
					"p.bateau = b and " +
					"c.id = ? and " +
					"b.nom = ?" , course_id, nomBateau).fetch();
			
			if(!bateaux.isEmpty())
			{
				message = "Un autre joueur à déjà ce nom de bateau";
				render("Courses/inscription.html", modele, couleurs, course, participants, message);	
			}			
			else
			{
				Couleur couleur = Couleur.findById(couleur_id);
				Bateau bateau = new Bateau(couleur, nomBateau, utilisateur, 0, modele);
				bateau.save();
				
				Participe participe = new Participe(course, bateau, 0, 0, new Date());
				participe.save();
				
				course.participes.add(participe);
				course.save();
				
				message = "Votre inscription a bien été prise en compte.";
				List<Course> courses = Course.findAll();
				
				render("Courses/list.html", message, courses, utilisateur);
			}
		}
	}
	
	public static void information_course(long course_id,long bateau_id,@Required
			@MaxSize(50)
			@MinSize(3)
		String nomBateau,
		long couleur_id)
	{
		Course course = Course.findById(course_id);
		Utilisateur utilisateur = Utilisateur.find("byPseudo", Security.connected()).first();
		Bateau bateau = Bateau.findById(bateau_id);
		List<Couleur> couleurs = Couleur.findAll();
		List<Participe> participants = course.participes;
		if(validation.hasErrors())
		{
			render("Courses/information.html", bateau, couleurs, course, participants);
		}
		else
		{
			String message = "";
			
			List<Bateau> bateaux = Course.find("select b " +
			"from Course c, Participe p, Bateau b " +
			"where p.course = c and " +
			"p.bateau = b and " +
			"c.id = ? and " +
			"b.nom = ? and " +
			"b.id != ?" , course_id, nomBateau, bateau_id).fetch();
			
			if(!bateaux.isEmpty())
			{
				message = "Un autre joueur à déjà ce nom de bateau";
				render("Courses/information.html", bateau, couleurs, course, participants, message);	
			}			
			else
			{
				Couleur couleur = Couleur.findById(couleur_id);
				bateau.couleur = couleur;
				bateau.nom = nomBateau;
				bateau.save();
				
				message = "Les modification de votre bateaux a bien été prise en compte.";
				List<Course> courses = Course.findAll();
				
				render("Courses/list.html", message, courses, utilisateur);
			}
		}
	}
	
	public static void jouer(long course_id)
	{
		render();
	}
}
